package org.grc.app.z_project.z_framework.proxy;

import java.lang.reflect.Method;
import java.util.List;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/*
 * 这个类提供一个创建代理的方法，
 * 输入：一个目标类和一组 Proxy接口实现，
 * 输出：一个代理对象。
 */

/**
 * 代理管理器
 * 
 * @author grc
 * @since 1.0-SNAPSHOT
 */
public class ProxyManager {

	// 使用 CGLib提供的 Enhancer.create()方法来创建代理对象，将 intercept的参数
	// 传入 ProxyChain的构造器中即可。
	@SuppressWarnings("unchecked")
	public static <T> T createProxy (final Class<?> targetClass, 
			final List<Proxy> proxyList) {
		return (T) Enhancer.create(targetClass, new MethodInterceptor() {
			@Override
			public Object intercept(Object targetObject, Method targetMethod, 
					Object[] methodParams, MethodProxy methodProxy) throws Throwable {
				return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy,
						methodParams, proxyList).doProxyChain();
			}
		});
	}
}
